// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.eva.android.x;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Paint;
import android.graphics.RectF;
import android.graphics.drawable.Drawable;
import android.util.Log;
import android.widget.ImageView;

import com.eva.android.BitmapHelper;
import com.eva.android.ToolKits;
import com.eva.android.widget.WidgetUtils;
import com.x52im.rbchat.R;

import androidx.core.graphics.drawable.RoundedBitmapDrawable;
import androidx.core.graphics.drawable.RoundedBitmapDrawableFactory;

/**
 * 实现图片的圆角。
 *
 * @author https://stackoverflow.com/questions/24878740/how-to-use-roundedbitmapdrawable
 * @since 7.1
 */
public class RoundedBitmapDrawableUtility {

    private static String TAG = RoundedBitmapDrawableUtility.class.getSimpleName();

    /**
     * 将指定的图片圆角化后，设置到指定的ImageView上。
     *
     * @param c context
     * @param imageResId 图片资源id
     * @param toIV 图像显示view
     * @param cornerRadius 圆角半径，单位：相素
     * @param borderWidth 边框大小，不需要可填-1
     * @param borderColor 边框颜色，不需要可填-1
     */
    public static void toRound(Context c, int imageResId, ImageView toIV,  int cornerRadius, int borderWidth, int borderColor)
    {
        Bitmap bm = BitmapHelper.drawableToBitmap(c, imageResId);
        if (bm != null) {
            RoundedBitmapDrawableUtility.toRound(c, bm, toIV, cornerRadius, borderWidth, borderColor);
        }
    }

    /**
     * 将指定的图片圆角化后，设置到指定的ImageView上。
     *
     * @param c context
     * @param originalBm 原始图
     * @param toIV 图像显示view
     * @param cornerRadius 圆角半径，单位：相素
     * @param borderWidth 边框大小，不需要可填-1
     * @param borderColor 边框颜色，不需要可填-1
     */
    public static void toRound(Context c, Bitmap originalBm, ImageView toIV,  int cornerRadius, int borderWidth, int borderColor) {
        Drawable dw = null;
        if(originalBm != null){
            try{
                Bitmap newBm = originalBm.isMutable()?originalBm : originalBm.copy(Bitmap.Config.ARGB_8888, true);
                dw = RoundedBitmapDrawableUtility.getRoundedSquareBitmapDrawable(c, newBm, cornerRadius, borderWidth, borderColor);
            }
            catch (OutOfMemoryError oom){
                Log.w(TAG, oom);
            }
            catch (Exception e){
                Log.w(TAG, e);
            }
        }

        if(dw != null)
            toIV.setImageDrawable(dw);
        else if(originalBm != null)
            toIV.setImageBitmap(originalBm);
    }

    public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap
            , int cornerRadius){
        return getRoundedSquareBitmapDrawable(context, originalBitmap, cornerRadius, -1, -1);
    }

    public static RoundedBitmapDrawable getRoundedSquareBitmapDrawable(Context context, Bitmap originalBitmap
            , int cornerRadius, int borderWidth, int borderColor){
        int originalBitmapWidth = originalBitmap.getWidth();
        int originalBitmapHeight = originalBitmap.getHeight();

        if(borderWidth != -1 && borderColor != -1){
            Canvas canvas = new Canvas(originalBitmap);
            canvas.drawBitmap(originalBitmap, 0, 0, null);

            Paint borderPaint = new Paint();
            borderPaint.setStyle(Paint.Style.STROKE);
            borderPaint.setStrokeWidth(borderWidth);
            borderPaint.setAntiAlias(true);
            borderPaint.setColor(borderColor);

            int roundedRectDelta = (borderWidth/3);
            RectF rectF = new RectF(0 + roundedRectDelta, 0 + roundedRectDelta
                    , originalBitmapWidth - roundedRectDelta, originalBitmapHeight - roundedRectDelta);
            canvas.drawRoundRect(rectF, cornerRadius, cornerRadius, borderPaint);
        }

        RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
        roundedImageBitmapDrawable.setCornerRadius(cornerRadius);
        roundedImageBitmapDrawable.setAntiAlias(true);
        return roundedImageBitmapDrawable;
    }

    public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap){
        return getCircleBitmapDrawable(context, originalBitmap, -1, -1);
    }

    public static RoundedBitmapDrawable getCircleBitmapDrawable(Context context, Bitmap originalBitmap, int borderWidth, int borderColor){
        if(borderWidth != -1 && borderColor != -1) {
            Canvas canvas = new Canvas(originalBitmap);
            canvas.drawBitmap(originalBitmap, 0, 0, null);

            Paint borderPaint = new Paint();
            borderPaint.setStyle(Paint.Style.STROKE);
            borderPaint.setStrokeWidth(borderWidth);
            borderPaint.setAntiAlias(true);
            borderPaint.setColor(borderColor);

            int circleDelta = (borderWidth / 2) - WidgetUtils.dip2px(context, 1);
            int radius = (canvas.getWidth() / 2) - circleDelta;
            canvas.drawCircle(canvas.getWidth() / 2, canvas.getHeight() / 2, radius, borderPaint);
        }

        RoundedBitmapDrawable roundedImageBitmapDrawable = RoundedBitmapDrawableFactory.create(context.getResources(), originalBitmap);
        roundedImageBitmapDrawable.setCircular(true);
        roundedImageBitmapDrawable.setAntiAlias(true);
        return roundedImageBitmapDrawable;
    }
}